/*
 * Copyright (c) 2016 zhangcm. All Rights Reserved.
 */
package com.deram.ctin.common.utils;

import com.google.common.base.Preconditions;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.joda.time.DateTime;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;


/**
 * 时间工具类
 *
 * @author zhangcm
 * @version 1.0, 2016/4/13
 */
public class DateUtils {

    public static final String DEFAULT_FORMAT_DATETIME = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_FORMAT_DATE = "yyyy-MM-dd";
    public static final String DEFAULT_FORMAT_TIME = "HH:mm:ss";

    private DateUtils() {

    }

    /**
     * 获取当前时间对象
     *
     * @return 时间对象
     */
    public static Date getNow() {
        return new Date();
    }

    /**
     * 获取当前时间戳
     *
     * @return 时间戳
     */
    public static Long getNowLong() {
        Date date = getNow();
        return parseTime(date);
    }

    public static Long getNowDateLong() {
        DateTime dateTime = new DateTime();
        return dateTime.withTimeAtStartOfDay().getMillis();
    }

    /**
     * 获取当前时间字符串，时间字符串格式为DEFAULT_FORMAT_DATETIME
     *
     * @return 时间字符串
     */
    public static String getNowStr() {
        Date date = getNow();
        return parseDateTimeStr(date);
    }

    /**
     * 把时间对象转成时间戳
     *
     * @param date 时间对象
     * @return 时间戳
     */
    public static Long parseTime(Date date) {
        Preconditions.checkNotNull(date);
        return date.getTime();
    }

    /**
     * 把时间戳转成时间对象
     *
     * @param time 时间戳
     * @return 时间对象
     */
    public static Date parseDate(Long time) {
        Preconditions.checkNotNull(time);
        return new Date(time);
    }

    /**
     * 把时间戳转成时间字符串，时间字符串格式为DEFAULT_FORMAT_DATETIME
     *
     * @param time 时间戳
     * @return 时间字符串
     */
    public static String parseDateTimeStr(Long time) {
        Date date = parseDate(time);
        return parseStr(date, DEFAULT_FORMAT_DATETIME);
    }

    /**
     * 把时间对象转成时间字符串，时间字符串格式为DEFAULT_FORMAT_DATETIME
     *
     * @param date 时间对象
     * @return 时间字符串
     */
    public static String parseDateTimeStr(Date date) {
        return parseStr(date, DEFAULT_FORMAT_DATETIME);
    }

    /**
     * 把时间戳转成时间字符串，时间字符串格式为自定义
     *
     * @param time   时间戳
     * @param format 时间字符串格式
     * @return 时间字符串
     */
    public static String parseStr(Long time, String format) {
        Date date = parseDate(time);
        return parseStr(date, format);
    }

    /**
     * 把时间对象转成时间字符串，时间字符串格式为自定义
     *
     * @param date   时间对象
     * @param format 时间字符串格式
     * @return 时间字符串
     */
    public static String parseStr(Date date, String format) {
        Preconditions.checkNotNull(date);
        Preconditions.checkNotNull(format);
        return DateFormatUtils.format(date, format);
    }

    /**
     *  把时间字符串转成时间对象
     * @param dateStr 时间字符串
     * @param format 时间字符串格式
     * @return 时间对象
     */
    public static Date parseDate(String dateStr, String format){
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        try {
            return sdf.parse(dateStr);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
}
